/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * UsuarioPresentacion.java
 *
 * Created on 10-ago-2010, 18:31:14
 */

package presentacion.acceso;

import hibernate.objeto.Usuario;
import logica.validacion.PersonaValidacion;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import logica.CapaLogica;
import logica.PersonaLogica;
import logica.UsuarioLogica;
import logica.validacion.CapaValidacion;
import logica.validacion.PacienteValidacion;
import logica.validacion.UsuarioValidacion;
import presentacion.CapaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.Paginador;
import presentacion.utilidad.tabla.MiModeloTabla;

/**
 *
 * @author Administrador
 */
public class UsuarioPresentacion extends javax.swing.JDialog {

    /** Creates new form PersonaPresentacion.
     */
    public UsuarioPresentacion(java.awt.Frame parent, boolean modal) {
        super(parent, modal);

        usuarioACargar = new Usuario();

        initComponents();
        personalizarGUI();
        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        setLocationRelativeTo(null);        
        setearEventosQueCapturanTeclaEnterYEscape();
    }

    /**
     * Setea datos de la ventana.
     *
     */
    private void personalizarGUI() {
        //Crea la barra de menu
        this.setJMenuBar(BarMenu.createMenuBarUsuario(this));
        
        MiModeloTabla.cargarTablaUsuario(null, tablaUsuario);
        botonCargarUsuario.setVisible(false);
        botonEliminarUsuario.setVisible(false);
        matriculaMedica.setVisible(false);
        textoMatriculaMedica.setVisible(false);

        iniciarPaginador();
    }

    /**
     * Al agregarse/modificarse un nuevo usuario se actualiza la tabla y se
     * selecciona por defecto el usuario mostrandose las propiedades del mismo.
     *
     * @param esCarga true si se cargó un usuario, false si se eliminó un usuario
     */
    private void actualizarUsuarioCargadoOEliminado(boolean esCarga) {
        busqueda.setText("");
        buscarSegunCriterio();

        if (esCarga) {
            //Se cargó un usuario
            while(!MiModeloTabla.seleccionarFilaDeTabla(String.valueOf(
                    usuarioACargar.getIdUsuario()), tablaUsuario, tablaUsuarioScrollPanel)) {
                paginarAdelanteTablaUsuario();
            }

            cargarOVerPropiedadesUsuario();
        } else {
            //Se eliminó un usuario
            habilitarCarga();
            botonCargarUsuario.setVisible(false);
            botonEliminarUsuario.setVisible(false);
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelVisualizacionUsuario = new javax.swing.JPanel();
        busqueda = new javax.swing.JTextField();
        botonBuscar = new javax.swing.JButton();
        textoFiltrar = new javax.swing.JLabel();
        filtrar = new javax.swing.JTextField();
        tablaUsuarioScrollPanel = new javax.swing.JScrollPane();
        tablaUsuario = new javax.swing.JTable(new MiModeloTabla());
        paginadorUno = new javax.swing.JPanel();
        botonAnteriorPaginadorUno = new javax.swing.JButton();
        botonSiguientePaginadorUno = new javax.swing.JButton();
        textoDescriptivoCargaUsuario = new javax.swing.JLabel();
        botonCargarUsuario = new javax.swing.JButton();
        panelUsuario = new javax.swing.JPanel();
        panelDatosPersona = new javax.swing.JPanel();
        nombre = new javax.swing.JTextField();
        textoNombre = new javax.swing.JLabel();
        numeroDeDocumento = new javax.swing.JTextField();
        scrollPaneComentarios = new javax.swing.JScrollPane();
        comentarios = new javax.swing.JTextArea();
        textoComentarios = new javax.swing.JLabel();
        textoTelefonoInterno = new javax.swing.JLabel();
        telefonoInterno = new javax.swing.JTextField();
        textoApellido = new javax.swing.JLabel();
        apellido = new javax.swing.JTextField();
        textoTelefonoMovil = new javax.swing.JLabel();
        telefonoMovil = new javax.swing.JTextField();
        textoTipoDeDocumento = new javax.swing.JLabel();
        textoCorreoElectronico = new javax.swing.JLabel();
        textoTelefonoParticular = new javax.swing.JLabel();
        tipoDeDocumento = new javax.swing.JComboBox();
        correoElectronico = new javax.swing.JTextField();
        telefonoParticular = new javax.swing.JTextField();
        textoNumeroDeDocumento = new javax.swing.JLabel();
        separador = new javax.swing.JSeparator();
        panelDatosUsuario = new javax.swing.JPanel();
        textoNombreDeUsuario = new javax.swing.JLabel();
        nombreDeUsuario = new javax.swing.JTextField();
        textoClave = new javax.swing.JLabel();
        clave = new javax.swing.JTextField();
        textoRepetirClave = new javax.swing.JLabel();
        repetirClave = new javax.swing.JTextField();
        textoTipoDeAcceso = new javax.swing.JLabel();
        tipoDeAcceso = new javax.swing.JComboBox();
        textoMatriculaMedica = new javax.swing.JLabel();
        matriculaMedica = new javax.swing.JTextField();
        esAdministrador = new javax.swing.JCheckBox();
        botonCancelar = new javax.swing.JButton();
        botonAceptar = new javax.swing.JButton();
        botonEliminarUsuario = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Gestión de Usuarios");
        setResizable(false);

        panelVisualizacionUsuario.setMinimumSize(new java.awt.Dimension(762, 130));
        panelVisualizacionUsuario.setPreferredSize(new java.awt.Dimension(1004, 201));

        busqueda.setFont(Fuente.FUENTE_AYUDA);
        busqueda.setForeground(Fuente.COLOR_AYUDA);
        busqueda.setText("Ingrese apellido o número de documento");
        busqueda.setToolTipText("Ingrese apellido o número de documento");
        busqueda.setPreferredSize(new java.awt.Dimension(210, 23));
        busqueda.setCaretPosition(0);
        busqueda.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                busquedaKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                busquedaKeyReleased(evt);
            }
        });

        botonBuscar.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonBuscar.setForeground(Fuente.COLOR_NORMAL);
        botonBuscar.setIcon(Icono.ICONO_16_BUSCAR);
        botonBuscar.setText("Buscar");
        botonBuscar.setToolTipText("Buscar usuarios");
        botonBuscar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonBuscarActionPerformed(evt);
            }
        });

        textoFiltrar.setFont(Fuente.FUENTE_LABEL);
        textoFiltrar.setText("Filtrar");
        textoFiltrar.setPreferredSize(new java.awt.Dimension(28, 20));

        filtrar.setToolTipText("Filtra los datos encontrados por algún criterio");
        filtrar.setPreferredSize(new java.awt.Dimension(200, 20));
        filtrar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                filtrarKeyReleased(evt);
            }
        });

        tablaUsuarioScrollPanel.setMinimumSize(new java.awt.Dimension(0, 0));
        tablaUsuarioScrollPanel.setPreferredSize(new java.awt.Dimension(984, 132));

        tablaUsuario.setToolTipText("Seleccione el paciente a gestionar");
        tablaUsuario.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaUsuarioMouseClicked(evt);
            }
        });
        tablaUsuario.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tablaUsuarioKeyReleased(evt);
            }
        });
        tablaUsuarioScrollPanel.setViewportView(tablaUsuario);
        MiModeloTabla.inicializarTabla(tablaUsuario);

        paginadorUno.setMaximumSize(new java.awt.Dimension(700, 14));

        botonAnteriorPaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonAnteriorPaginadorUno.setIcon(Icono.ICONO_16_ANTERIOR);
        botonAnteriorPaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonAnteriorPaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAnteriorPaginadorUnoActionPerformed(evt);
            }
        });

        botonSiguientePaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonSiguientePaginadorUno.setIcon(Icono.ICONO_16_SIGUIENTE);
        botonSiguientePaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonSiguientePaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaginadorUnoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout paginadorUnoLayout = new javax.swing.GroupLayout(paginadorUno);
        paginadorUno.setLayout(paginadorUnoLayout);
        paginadorUnoLayout.setHorizontalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createSequentialGroup()
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        paginadorUnoLayout.setVerticalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout panelVisualizacionUsuarioLayout = new javax.swing.GroupLayout(panelVisualizacionUsuario);
        panelVisualizacionUsuario.setLayout(panelVisualizacionUsuarioLayout);
        panelVisualizacionUsuarioLayout.setHorizontalGroup(
            panelVisualizacionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVisualizacionUsuarioLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelVisualizacionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(tablaUsuarioScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelVisualizacionUsuarioLayout.createSequentialGroup()
                        .addComponent(busqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 426, Short.MAX_VALUE)
                        .addComponent(textoFiltrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelVisualizacionUsuarioLayout.setVerticalGroup(
            panelVisualizacionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelVisualizacionUsuarioLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelVisualizacionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(busqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoFiltrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tablaUsuarioScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        textoDescriptivoCargaUsuario.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoCargaUsuario.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoCargaUsuario.setText("Ingrese los datos del usuario");
        textoDescriptivoCargaUsuario.setPreferredSize(new java.awt.Dimension(463, 23));

        botonCargarUsuario.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonCargarUsuario.setForeground(Fuente.COLOR_NORMAL);
        botonCargarUsuario.setIcon(Icono.ICONO_16_AGREGAR);
        botonCargarUsuario.setText("Agregar usuario");
        botonCargarUsuario.setToolTipText("Agrega los datos para cargar un usuario");
        botonCargarUsuario.setPreferredSize(new java.awt.Dimension(160, 20));
        botonCargarUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCargarUsuarioActionPerformed(evt);
            }
        });

        panelUsuario.setMinimumSize(new java.awt.Dimension(462, 197));
        panelUsuario.setPreferredSize(new java.awt.Dimension(1004, 428));

        nombre.setFont(Fuente.FUENTE_TEXTFIELD);
        nombre.setForeground(Fuente.COLOR_NORMAL);
        nombre.setPreferredSize(new java.awt.Dimension(343, 20));

        textoNombre.setFont(Fuente.FUENTE_LABEL);
        textoNombre.setForeground(Fuente.COLOR_NORMAL);
        textoNombre.setText("Nombre");
        textoNombre.setPreferredSize(new java.awt.Dimension(95, 20));

        numeroDeDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        numeroDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        numeroDeDocumento.setPreferredSize(new java.awt.Dimension(110, 20));

        comentarios.setColumns(20);
        comentarios.setFont(Fuente.FUENTE_TEXTFIELD);
        comentarios.setForeground(Fuente.COLOR_NORMAL);
        comentarios.setLineWrap(true);
        comentarios.setRows(2);
        comentarios.setWrapStyleWord(true);
        scrollPaneComentarios.setViewportView(comentarios);

        textoComentarios.setFont(Fuente.FUENTE_LABEL);
        textoComentarios.setForeground(Fuente.COLOR_NORMAL);
        textoComentarios.setText("Comentarios");
        textoComentarios.setPreferredSize(new java.awt.Dimension(95, 20));

        textoTelefonoInterno.setFont(Fuente.FUENTE_LABEL);
        textoTelefonoInterno.setForeground(Fuente.COLOR_NORMAL);
        textoTelefonoInterno.setText("Teléfono interno");
        textoTelefonoInterno.setPreferredSize(new java.awt.Dimension(95, 20));

        telefonoInterno.setFont(Fuente.FUENTE_TEXTFIELD);
        telefonoInterno.setForeground(Fuente.COLOR_NORMAL);
        telefonoInterno.setPreferredSize(new java.awt.Dimension(343, 20));

        textoApellido.setFont(Fuente.FUENTE_LABEL);
        textoApellido.setForeground(Fuente.COLOR_NORMAL);
        textoApellido.setText("Apellido");
        textoApellido.setPreferredSize(new java.awt.Dimension(95, 20));

        apellido.setFont(Fuente.FUENTE_TEXTFIELD);
        apellido.setForeground(Fuente.COLOR_NORMAL);
        apellido.setPreferredSize(new java.awt.Dimension(343, 20));

        textoTelefonoMovil.setFont(Fuente.FUENTE_LABEL);
        textoTelefonoMovil.setForeground(Fuente.COLOR_NORMAL);
        textoTelefonoMovil.setText("Teléfono móvil");
        textoTelefonoMovil.setPreferredSize(new java.awt.Dimension(95, 20));

        telefonoMovil.setFont(Fuente.FUENTE_TEXTFIELD);
        telefonoMovil.setForeground(Fuente.COLOR_NORMAL);
        telefonoMovil.setPreferredSize(new java.awt.Dimension(343, 20));

        textoTipoDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoTipoDeDocumento.setText("Tipo documento");
        textoTipoDeDocumento.setPreferredSize(new java.awt.Dimension(95, 20));

        textoCorreoElectronico.setFont(Fuente.FUENTE_LABEL);
        textoCorreoElectronico.setForeground(Fuente.COLOR_NORMAL);
        textoCorreoElectronico.setText("Correo electrónico");
        textoCorreoElectronico.setPreferredSize(new java.awt.Dimension(95, 20));

        textoTelefonoParticular.setFont(Fuente.FUENTE_LABEL);
        textoTelefonoParticular.setForeground(Fuente.COLOR_NORMAL);
        textoTelefonoParticular.setText("Teléfono particular");
        textoTelefonoParticular.setPreferredSize(new java.awt.Dimension(95, 20));

        tipoDeDocumento.setFont(Fuente.FUENTE_COMBOBOX);
        tipoDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        tipoDeDocumento.setModel(CapaPresentacion.getListaDeTipoDeDocumento());
        tipoDeDocumento.setPreferredSize(new java.awt.Dimension(110, 20));

        correoElectronico.setFont(Fuente.FUENTE_TEXTFIELD);
        correoElectronico.setForeground(Fuente.COLOR_NORMAL);
        correoElectronico.setPreferredSize(new java.awt.Dimension(343, 20));

        telefonoParticular.setFont(Fuente.FUENTE_TEXTFIELD);
        telefonoParticular.setForeground(Fuente.COLOR_NORMAL);
        telefonoParticular.setPreferredSize(new java.awt.Dimension(343, 20));

        textoNumeroDeDocumento.setFont(Fuente.FUENTE_LABEL);
        textoNumeroDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoNumeroDeDocumento.setText("Número documento");
        textoNumeroDeDocumento.setPreferredSize(new java.awt.Dimension(95, 20));

        javax.swing.GroupLayout panelDatosPersonaLayout = new javax.swing.GroupLayout(panelDatosPersona);
        panelDatosPersona.setLayout(panelDatosPersonaLayout);
        panelDatosPersonaLayout.setHorizontalGroup(
            panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatosPersonaLayout.createSequentialGroup()
                .addContainerGap(243, Short.MAX_VALUE)
                .addComponent(textoNumeroDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(numeroDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelDatosPersonaLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDatosPersonaLayout.createSequentialGroup()
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(textoTipoDeDocumento, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(textoNombre, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(nombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(tipoDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDatosPersonaLayout.createSequentialGroup()
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(textoTelefonoInterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(textoTelefonoParticular, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(textoApellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(textoTelefonoMovil, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(telefonoInterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(telefonoMovil, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(telefonoParticular, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(apellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDatosPersonaLayout.createSequentialGroup()
                            .addComponent(textoComentarios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(scrollPaneComentarios, javax.swing.GroupLayout.DEFAULT_SIZE, 343, Short.MAX_VALUE))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDatosPersonaLayout.createSequentialGroup()
                            .addComponent(textoCorreoElectronico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(correoElectronico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap()))
        );
        panelDatosPersonaLayout.setVerticalGroup(
            panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(numeroDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoNumeroDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(276, Short.MAX_VALUE))
            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panelDatosPersonaLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(textoTipoDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(tipoDeDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(textoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(nombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(panelDatosPersonaLayout.createSequentialGroup()
                            .addComponent(textoApellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(textoTelefonoInterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(telefonoInterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(textoTelefonoParticular, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(panelDatosPersonaLayout.createSequentialGroup()
                            .addComponent(apellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(42, 42, 42)
                            .addComponent(telefonoParticular, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(telefonoMovil, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(textoTelefonoMovil, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(textoCorreoElectronico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(correoElectronico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addGroup(panelDatosPersonaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(textoComentarios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(scrollPaneComentarios, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
        );

        separador.setOrientation(javax.swing.SwingConstants.VERTICAL);
        separador.setPreferredSize(new java.awt.Dimension(5, 10));

        panelDatosUsuario.setPreferredSize(new java.awt.Dimension(486, 119));

        textoNombreDeUsuario.setFont(Fuente.FUENTE_LABEL);
        textoNombreDeUsuario.setForeground(Fuente.COLOR_NORMAL);
        textoNombreDeUsuario.setText("Nombre de usuario");
        textoNombreDeUsuario.setPreferredSize(new java.awt.Dimension(95, 20));

        nombreDeUsuario.setFont(Fuente.FUENTE_TEXTFIELD);
        nombreDeUsuario.setForeground(Fuente.COLOR_NORMAL);
        nombreDeUsuario.setPreferredSize(new java.awt.Dimension(130, 20));

        textoClave.setFont(Fuente.FUENTE_LABEL);
        textoClave.setForeground(Fuente.COLOR_NORMAL);
        textoClave.setText("Clave");
        textoClave.setPreferredSize(new java.awt.Dimension(95, 20));

        clave.setFont(Fuente.FUENTE_TEXTFIELD);
        clave.setForeground(Fuente.COLOR_NORMAL);
        clave.setPreferredSize(new java.awt.Dimension(130, 20));

        textoRepetirClave.setFont(Fuente.FUENTE_LABEL);
        textoRepetirClave.setForeground(Fuente.COLOR_NORMAL);
        textoRepetirClave.setText("Repetir clave");
        textoRepetirClave.setPreferredSize(new java.awt.Dimension(95, 20));

        repetirClave.setFont(Fuente.FUENTE_TEXTFIELD);
        repetirClave.setForeground(Fuente.COLOR_NORMAL);
        repetirClave.setPreferredSize(new java.awt.Dimension(130, 20));

        textoTipoDeAcceso.setFont(Fuente.FUENTE_LABEL);
        textoTipoDeAcceso.setForeground(Fuente.COLOR_NORMAL);
        textoTipoDeAcceso.setText("Acceso");
        textoTipoDeAcceso.setPreferredSize(new java.awt.Dimension(95, 20));

        tipoDeAcceso.setFont(Fuente.FUENTE_COMBOBOX);
        tipoDeAcceso.setForeground(Fuente.COLOR_NORMAL);
        tipoDeAcceso.setModel(CapaPresentacion.getListaDeTipoDeAcceso());
        tipoDeAcceso.setPreferredSize(new java.awt.Dimension(130, 20));
        tipoDeAcceso.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                tipoDeAccesoItemStateChanged(evt);
            }
        });

        textoMatriculaMedica.setFont(Fuente.FUENTE_LABEL);
        textoMatriculaMedica.setForeground(Fuente.COLOR_NORMAL);
        textoMatriculaMedica.setText("Matrícula médica");
        textoMatriculaMedica.setPreferredSize(new java.awt.Dimension(95, 20));

        matriculaMedica.setFont(Fuente.FUENTE_TEXTFIELD);
        matriculaMedica.setForeground(Fuente.COLOR_NORMAL);
        matriculaMedica.setPreferredSize(new java.awt.Dimension(130, 20));

        esAdministrador.setFont(Fuente.FUENTE_CHECKBOX);
        esAdministrador.setForeground(Fuente.COLOR_NORMAL);
        esAdministrador.setText("Administrador de usuarios");

        javax.swing.GroupLayout panelDatosUsuarioLayout = new javax.swing.GroupLayout(panelDatosUsuario);
        panelDatosUsuario.setLayout(panelDatosUsuarioLayout);
        panelDatosUsuarioLayout.setHorizontalGroup(
            panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                        .addComponent(textoNombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(nombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                        .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                                .addComponent(textoTipoDeAcceso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(tipoDeAcceso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(textoMatriculaMedica, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                                .addComponent(textoClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(clave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(textoRepetirClave, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(10, 10, 10)
                        .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(matriculaMedica, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(repetirClave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addComponent(esAdministrador))
                .addContainerGap())
        );
        panelDatosUsuarioLayout.setVerticalGroup(
            panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosUsuarioLayout.createSequentialGroup()
                .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoNombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(nombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textoClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(clave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(textoRepetirClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(repetirClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelDatosUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoTipoDeAcceso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tipoDeAcceso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoMatriculaMedica, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(matriculaMedica, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(esAdministrador)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout panelUsuarioLayout = new javax.swing.GroupLayout(panelUsuario);
        panelUsuario.setLayout(panelUsuarioLayout);
        panelUsuarioLayout.setHorizontalGroup(
            panelUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelUsuarioLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelDatosPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(separador, javax.swing.GroupLayout.PREFERRED_SIZE, 5, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(10, 10, 10)
                .addComponent(panelDatosUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(13, 13, 13))
        );
        panelUsuarioLayout.setVerticalGroup(
            panelUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelUsuarioLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelDatosUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(separador, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(panelDatosPersona, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(110, 110, 110))
        );

        botonCancelar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonCancelar.setForeground(Fuente.COLOR_NORMAL);
        botonCancelar.setIcon(Icono.ICONO_16_CANCELAR);
        botonCancelar.setText("Cancelar");
        botonCancelar.setToolTipText("Cancela la operación");
        botonCancelar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        botonAceptar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonAceptar.setForeground(Fuente.COLOR_NORMAL);
        botonAceptar.setIcon(Icono.ICONO_16_ACEPTAR);
        botonAceptar.setText("Aceptar");
        botonAceptar.setToolTipText("Agrega el usuario");
        botonAceptar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        botonEliminarUsuario.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonEliminarUsuario.setForeground(Fuente.COLOR_NORMAL);
        botonEliminarUsuario.setIcon(Icono.ICONO_16_QUITAR);
        botonEliminarUsuario.setText("Eliminar usuario");
        botonEliminarUsuario.setToolTipText("Elimina el usuario seleccionado");
        botonEliminarUsuario.setPreferredSize(new java.awt.Dimension(160, 20));
        botonEliminarUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarUsuarioActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 1004, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelVisualizacionUsuario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(textoDescriptivoCargaUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 211, Short.MAX_VALUE)
                        .addComponent(botonEliminarUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonCargarUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelVisualizacionUsuario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoDescriptivoCargaUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonCargarUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonEliminarUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 428, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        this.dispose();
}//GEN-LAST:event_botonCancelarActionPerformed

    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        //Resetea paginador
        Paginador.paginarElemento[0] = false;
        agregarOModificarUsuario();
}//GEN-LAST:event_botonAceptarActionPerformed
//GEN-FIRST:event_tipoDeDocumentoPersonalFocusLost
//GEN-LAST:event_tipoDeDocumentoPersonalFocusLost
//GEN-FIRST:event_numeroDeDocumentoPersonalFocusLost
//GEN-LAST:event_numeroDeDocumentoPersonalFocusLost
//GEN-FIRST:event_fechaDeNacimientoPersonalPropertyChange
//GEN-LAST:event_fechaDeNacimientoPersonalPropertyChange

    private void botonCargarUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCargarUsuarioActionPerformed
        cargarUsuario();
}//GEN-LAST:event_botonCargarUsuarioActionPerformed

    /**
     * Habilita la carga de un nuevo usuario.
     * 
     */
    public void cargarUsuario() {
        habilitarCarga();
        //Deselecciona lo seleccionado en la tabla
        tablaUsuario.clearSelection();
        botonCargarUsuario.setVisible(false);
        botonEliminarUsuario.setVisible(false);
        usuarioACargar = new Usuario();
    }

    /**
     * Al seleccionar una objeto Usuario de la tabla deben inhabilitarse los
     * campos de carga. Si el objeto es nulo se permite el ingresos de los datos.
     *
     */
    private void cargarOVerPropiedadesUsuario() {
        usuarioAVisualizar = (Usuario)
                MiModeloTabla.recuperarObjetoDeTabla(
                Usuario.class.getName(), tablaUsuario);

        if (usuarioAVisualizar == null) {
            usuarioACargar = new Usuario();
            habilitarCarga();
            botonCargarUsuario.setVisible(false);
            botonEliminarUsuario.setVisible(false);
        } else if (usuarioAVisualizar != null) {
            usuarioACargar = usuarioAVisualizar;
            habilitarPropiedades();
        }
    }

    /**
     * Habilita los campos necesarios para cargar un examen complementario.
     *
     */
    private void habilitarCarga() {
        textoDescriptivoCargaUsuario.setText("Ingrese los datos del usuario");
        setearEstadoCampos(true);
        limpiarPantalla();

        CapaPresentacion.personalizarBotonesEnCargaDeDatos(
                botonAceptar, botonCancelar);
    }

    /**
     * Habilita los campos necesarios para visualizar propiedades del usuario.
     *
     */
    public void habilitarPropiedades() {
        textoDescriptivoCargaUsuario.setText("Propiedades");

        //Si es el adminitrador no se permite modificacion
        if (usuarioAVisualizar.getNombreDeUsuarioUsuario().equals("admin")) {
            setearEstadoCampos(false);
            botonEliminarUsuario.setVisible(false);
            CapaPresentacion.personalizarBotonesEnVisualizacion(
                    botonAceptar, botonCancelar);
        } else {
            setearEstadoCampos(true);
            botonEliminarUsuario.setVisible(true);
            CapaPresentacion.personalizarBotonesEnCargaDeDatos(
                    botonAceptar, botonCancelar);
        }

        exhibirDatosEnPantalla();
        botonCargarUsuario.setVisible(true);
    }

    /**
     * Setea un campo a habilitado o inhabilitado según el parámetro. También
     * setea en Normal el color de los textos.
     *
     * @param estado El estado a setear: true para carga, false para visualizción
     */
    private void setearEstadoCampos(boolean estado) {
        esAdministrador.setEnabled(estado);
        textoNombreDeUsuario.setForeground(Fuente.COLOR_NORMAL);
        nombreDeUsuario.setEnabled(estado);
        textoClave.setForeground(Fuente.COLOR_NORMAL);
        clave.setEnabled(estado);
        textoRepetirClave.setForeground(Fuente.COLOR_NORMAL);
        repetirClave.setEnabled(estado);
        textoTipoDeAcceso.setForeground(Fuente.COLOR_NORMAL);
        tipoDeAcceso.setEnabled(estado);
        textoMatriculaMedica.setForeground(Fuente.COLOR_NORMAL);
        matriculaMedica.setEnabled(estado);
        textoTipoDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        tipoDeDocumento.setEnabled(estado);
        textoNumeroDeDocumento.setForeground(Fuente.COLOR_NORMAL);
        numeroDeDocumento.setEnabled(estado);
        textoNombre.setForeground(Fuente.COLOR_NORMAL);
        nombre.setEnabled(estado);
        textoApellido.setForeground(Fuente.COLOR_NORMAL);
        apellido.setEnabled(estado);
        textoTelefonoInterno.setForeground(Fuente.COLOR_NORMAL);
        telefonoInterno.setEnabled(estado);
        textoTelefonoParticular.setForeground(Fuente.COLOR_NORMAL);
        telefonoParticular.setEnabled(estado);
        textoTelefonoMovil.setForeground(Fuente.COLOR_NORMAL);
        telefonoMovil.setEnabled(estado);
        textoCorreoElectronico.setForeground(Fuente.COLOR_NORMAL);
        correoElectronico.setEnabled(estado);
        comentarios.setEnabled(estado);
    }

    /**
     * En caso de que se trate de la modificación de un usuario, se cargan
     * los datos de la misma en los distintos campos de la pantalla.
     *
     */
    private void exhibirDatosEnPantalla() {
        esAdministrador.setSelected(
                usuarioAVisualizar.isAdministradorUsuario());
        nombreDeUsuario.setText(
                usuarioAVisualizar.getNombreDeUsuarioUsuario());
        nombreDeUsuario.setCaretPosition(0);
        clave.setText(
                usuarioAVisualizar.getClaveUsuario());
        clave.setCaretPosition(0);
        repetirClave.setText(
                usuarioAVisualizar.getClaveUsuario());
        repetirClave.setCaretPosition(0);
        tipoDeAcceso.setSelectedIndex(
                CapaPresentacion.getIndiceComboBoxPorString(
                usuarioAVisualizar.getTipoDeAccesoUsuario(),
                tipoDeAcceso));
        if (usuarioAVisualizar.getMatriculaMedicaUsuario() != null) {
            matriculaMedica.setText(
                String.valueOf(usuarioAVisualizar.getMatriculaMedicaUsuario()));
            matriculaMedica.setCaretPosition(0);
        }
        tipoDeDocumento.setSelectedIndex(
                CapaPresentacion.getIndiceComboBoxPorString(
                usuarioAVisualizar.getPersona().getTipoDeDocumentoPersona(),
                tipoDeDocumento));
        numeroDeDocumento.setText(
                usuarioAVisualizar.getPersona().getNumeroDeDocumentoPersona());
        numeroDeDocumento.setCaretPosition(0);
        nombre.setText(
                usuarioAVisualizar.getPersona().getNombrePersona());
        nombre.setCaretPosition(0);
        apellido.setText(
                usuarioAVisualizar.getPersona().getApellidoPersona());
        apellido.setCaretPosition(0);
        telefonoInterno.setText(
                usuarioAVisualizar.getTelefonoInternoUsuario());
        telefonoInterno.setCaretPosition(0);
        telefonoParticular.setText(
                usuarioAVisualizar.getPersona().getTelefonoParticularPersona());
        telefonoParticular.setCaretPosition(0);
        telefonoMovil.setText(
                usuarioAVisualizar.getPersona().getTelefonoMovilPersona());
        telefonoMovil.setCaretPosition(0);
        correoElectronico.setText(
                usuarioAVisualizar.getPersona().getCorreoElectronicoPersona());
        correoElectronico.setCaretPosition(0);
        comentarios.setText(
                usuarioAVisualizar.getComentarioUsuario());
        comentarios.setCaretPosition(0);
    }

    /**
     * Limpia pantalla.
     *
     */
    private void limpiarPantalla() {
        esAdministrador.setSelected(false);
        nombreDeUsuario.setText("");
        clave.setText("");
        repetirClave.setText("");
        tipoDeAcceso.setSelectedIndex(0);
        matriculaMedica.setText("");
        tipoDeDocumento.setSelectedIndex(0);
        numeroDeDocumento.setText("");
        nombre.setText("");
        apellido.setText("");
        telefonoInterno.setText("");
        telefonoParticular.setText("");
        telefonoMovil.setText("");
        correoElectronico.setText("");
        comentarios.setText("");
    }

    private void tablaUsuarioMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaUsuarioMouseClicked
        cargarOVerPropiedadesUsuario();
}//GEN-LAST:event_tablaUsuarioMouseClicked

    private void busquedaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_busquedaKeyPressed
        if (busqueda.getText().equalsIgnoreCase(
                "Ingrese apellido o número de documento")) {
            busqueda.setFont(Fuente.FUENTE_TEXTFIELD);
            busqueda.setForeground(Fuente.COLOR_NORMAL);
            busqueda.setText("");
            busqueda.setCaretPosition(0);
        }
}//GEN-LAST:event_busquedaKeyPressed

    private void busquedaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_busquedaKeyReleased
        if(busqueda.getText().isEmpty()){
            busqueda.setFont(Fuente.FUENTE_AYUDA);
            busqueda.setForeground(Fuente.COLOR_AYUDA);
            busqueda.setText("Ingrese apellido o número de documento");
            busqueda.setCaretPosition(0);
        }
}//GEN-LAST:event_busquedaKeyReleased

    private void botonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonBuscarActionPerformed
        //Carga la tabla de usuarios
        CapaPresentacion.personalizarBotonesPaginadorActivado(
                botonAnteriorPaginadorUno, botonSiguientePaginadorUno);
        //Resetea paginador
        Paginador.paginarElemento[0] = false;
        buscarSegunCriterio();
}//GEN-LAST:event_botonBuscarActionPerformed

    /**
     * Según el criterio de busqueda consulta a la base de datos para mostrar
     * los resultados en la tabla.
     *
     * @return El vector de objetos Usuario que se cargará en la tabla
     */
    private Vector<Usuario> buscarSegunCriterio() {
        //Si corresponde vuelve a cero el indice del paginador, de lo contrario
        //Lo deja en el valor que se encuentra
        Paginador.actualizaIndice(0);
        if (busqueda.getText().
                equalsIgnoreCase("Ingrese apellido o número de documento")) {
            busqueda.setText("");
        }

        //Número de documento
        if (CapaValidacion.esTodoNumero(busqueda.getText())) {
            //Recupera los usuarios de la base de datos por documento
            vectorUsuario = UsuarioLogica.getVectorUsuarioPorNumeroDocumentoYEnBd(
                    busqueda.getText());
        //Apellido
        } else {
            //Recupera los usuarios de la base de datos por apellido
            vectorUsuario = UsuarioLogica.getVectorUsuarioPorApellidoYEnBd(
                    busqueda.getText());
        }

        MiModeloTabla.cargarTablaUsuario(vectorUsuario, tablaUsuario);

        if (busqueda.getText().isEmpty()) {
            busqueda.setText("Ingrese apellido o número de documento");
        }

        return vectorUsuario;
    }
    
    private void filtrarKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_filtrarKeyReleased
        TableRowSorter<MiModeloTabla> sorter = new TableRowSorter<MiModeloTabla>
                ((MiModeloTabla) tablaUsuario.getModel());

        tablaUsuario.setRowSorter(sorter);
        String texto = filtrar.getText();
        if (texto.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter("(?i).*" + texto + ".*"));
        }
}//GEN-LAST:event_filtrarKeyReleased

    private void tipoDeAccesoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_tipoDeAccesoItemStateChanged
        if (tipoDeAcceso.getSelectedItem().toString().equalsIgnoreCase("Médico")) {
            matriculaMedica.setVisible(true);
            textoMatriculaMedica.setVisible(true);
        } else {
            matriculaMedica.setVisible(false);
            textoMatriculaMedica.setVisible(false);
        }
    }//GEN-LAST:event_tipoDeAccesoItemStateChanged

    private void tablaUsuarioKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tablaUsuarioKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_UP
                || evt.getKeyCode() == KeyEvent.VK_DOWN) {
            cargarOVerPropiedadesUsuario();
        }
    }//GEN-LAST:event_tablaUsuarioKeyReleased

    private void botonEliminarUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarUsuarioActionPerformed
        eliminarUsuario();
    }//GEN-LAST:event_botonEliminarUsuarioActionPerformed

    private void botonAnteriorPaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAnteriorPaginadorUnoActionPerformed
        paginarAtrasTablaUsuario();
}//GEN-LAST:event_botonAnteriorPaginadorUnoActionPerformed

    private void botonSiguientePaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaginadorUnoActionPerformed
        paginarAdelanteTablaUsuario();
}//GEN-LAST:event_botonSiguientePaginadorUnoActionPerformed

    /**
     * Agrega/modifica un usuario a la base de datos.
     *
     * @return true si lo agregó/modificó correctamente, false en caso contrario
     */
    public void agregarOModificarUsuario() {
        //Confirmar modificación
        if (confirmarModificacion()) {
            //Valida los campos
            if (validarCampos()) {
                //Verifica la unicidadValida los campos
                if (esPersonaUnica()) {
                    if (esUsuarioUnico()) {
                        if (esCorreoElectronicoUnico()) {
                            //Carga toda la información de la pantalla
                            recopilarInformacion();
                            int[] idObjetoCreado = new int[1];
                            //Agrega/modifica la persona
                            if (UsuarioLogica.agregarOModificarUsuario(datosUsuario,
                                    usuarioACargar, idObjetoCreado)) {
                                //Setea  agregada/modificada
                                usuarioACargar = UsuarioLogica.getUsuarioPorId(
                                        idObjetoCreado[0]);
                                actualizarUsuarioCargadoOEliminado(true);
                            }
            // Errores
                        } else {
                            MensajePresentacion.errorDuplicidadObjeto(
                                "El correo electrónico");
                        }
            
                    } else {
                        MensajePresentacion.errorDuplicidadObjeto(
                                "El nombre de usuario");
                    }
                } else {
                    MensajePresentacion.errorDuplicidadObjeto(
                            "La persona");
                }
            } else {
                MensajePresentacion.errorDatosInvalidos();
            }
        }
    }

    /**
     * Elimina el usuario seleccionado.
     *
     */
    public void eliminarUsuario() {
        if (usuarioAVisualizar != null &&
                MensajePresentacion.confimarEliminacionObjeto(
                "usuario", "el") == JOptionPane.OK_OPTION) {
            UsuarioLogica.eliminarUsuario(usuarioAVisualizar);
            actualizarUsuarioCargadoOEliminado(false);
        }
    }

    /**
     * Recopila los datos del usuario a agregar/modificar.
     *
     */
    private void recopilarInformacion() {
        datosUsuario = new String[16];

        //Usuario 5: Es administrador
        datosUsuario[CapaLogica.USUARIO_ES_ADMINISTRADOR] =
                String.valueOf(esAdministrador.isSelected());
        //Usuario 6: Usuario
        datosUsuario[CapaLogica.USUARIO_NOMBRE_DE_USUARIO] =
                nombreDeUsuario.getText();
        //Usuario 7: Clave
        datosUsuario[CapaLogica.USUARIO_CLAVE] =
                clave.getText();
        //Usuario 8: Tipo de acceso
        datosUsuario[CapaLogica.USUARIO_TIPO_DE_ACCESO] =
                tipoDeAcceso.getSelectedItem().toString();
        //Usuario 9: Matricula Medica
        datosUsuario[CapaLogica.USUARIO_MATRICULA_MEDICA] =
                matriculaMedica.getText();
        //Persona 0: Tipo de documento
        datosUsuario[CapaLogica.PERSONA_TIPO_DE_DOCUMENTO] =
                tipoDeDocumento.getSelectedItem().toString();
        //Persona 1: Numero de documento
        datosUsuario[CapaLogica.PERSONA_NUMERO_DE_DOCUMENTO] =
                numeroDeDocumento.getText();
        //Persona 2: Nombre
        datosUsuario[CapaLogica.PERSONA_NOMBRE] =
                nombre.getText();
        //Persona 3: Apellido
        datosUsuario[CapaLogica.PERSONA_APELLIDO] =
                apellido.getText();
        //Usuario 10: Teléfono interno
        datosUsuario[CapaLogica.USUARIO_TELEFONO_INTERNO] =
                telefonoInterno.getText();
        //Persona 13: Teléfono particular
        datosUsuario[CapaLogica.PERSONA_TELEFONO_PARTICULAR] =
                telefonoParticular.getText();
        //Persona 14: Teléfono movil
        datosUsuario[CapaLogica.PERSONA_TELEFONO_MOVIL] =
                telefonoMovil.getText();
        //Usuario 15: Correo electronico
        datosUsuario[CapaLogica.PERSONA_CORREO_ELECTRONICO] =
                correoElectronico.getText();
        //Usuario 11: Comentarios
        datosUsuario[CapaLogica.USUARIO_COMENTARIOS] =
                comentarios.getText();
    }

    /**
     * Valida los campos ingresados.
     *
     * @return true si los campos estan listos para cargarse, false en caso
     * contrario
     */
    private boolean validarCampos() {
        boolean esNombreDeUsuarioValido = true;
        boolean esFormatoClaveValido = true;
        boolean esClaveValido = true;
        boolean esTipoDeAccesoValido = true;
        boolean esMatriculaMedicaValido = true;
        boolean esDocumentoValido = true;
        boolean esNombreValido = true;
        boolean esApellidoValido = true;
        boolean esTelefonoInternoValido = true;
        boolean esTelefonoParticularValido = true;
        boolean esTelefonoMovilValido = true;
        boolean esCorreoElectronicoValido = true;

        //Manejo de la validación de usuario
        if (!UsuarioValidacion.validarNombreDeUsuarioYClave(
                nombreDeUsuario.getText())) {
            textoNombreDeUsuario.setForeground(
                    Fuente.COLOR_ERROR);
            textoNombreDeUsuario.setToolTipText(
                    InformeError.INFORME_ERROR_USUARIO_NOMBRE_DE_USUARIO);
            esNombreDeUsuarioValido = false;
        } else {
            textoNombreDeUsuario.setForeground(Fuente.COLOR_NORMAL);
            textoNombreDeUsuario.setToolTipText(null);
            esNombreDeUsuarioValido = true;
        }

        //Manejo de la validación de clave
        if (!UsuarioValidacion.validarNombreDeUsuarioYClave(
                clave.getText())) {
            textoClave.setForeground(
                    Fuente.COLOR_ERROR);
            textoClave.setToolTipText(
                    InformeError.INFORME_ERROR_USUARIO_CLAVE_FORMATO);
            esFormatoClaveValido = false;
        } else {
            textoClave.setForeground(Fuente.COLOR_NORMAL);
            textoClave.setToolTipText(null);
            esFormatoClaveValido = true;
        }

        if (!clave.getText().equals(repetirClave.getText())) {
            textoRepetirClave.setForeground(Fuente.COLOR_ERROR);
            textoRepetirClave.setToolTipText(
                    InformeError.INFORME_ERROR_USUARIO_CLAVE_NO_COINCIDE);
            esClaveValido = false;
        }  else {
            textoRepetirClave.setForeground(Fuente.COLOR_NORMAL);
            textoRepetirClave.setToolTipText(null);
            esClaveValido = true;
        }

        //Manejo del tipo de acceso
        if (!CapaValidacion.validarCampoObligatorio(
                tipoDeAcceso.getSelectedItem().toString())) {
            textoTipoDeAcceso.setForeground(
                    Fuente.COLOR_ERROR);
            textoTipoDeAcceso.setToolTipText(
                    InformeError.INFORME_ERROR_USUARIO_TIPO_DE_ACCESO);
            esTipoDeAccesoValido = false;
        } else {
            textoTipoDeAcceso.setForeground(Fuente.COLOR_NORMAL);
            textoTipoDeAcceso.setToolTipText(null);
            esTipoDeAccesoValido = true;
        }

        //Manejo de la validación de la matrícula
        if (tipoDeAcceso.getSelectedItem().toString().equalsIgnoreCase("Médico") &&
                !UsuarioValidacion.validarMatriculaMedica(matriculaMedica.getText())) {
            textoMatriculaMedica.setForeground(
                    Fuente.COLOR_ERROR);
            textoMatriculaMedica.setToolTipText(
                    InformeError.INFORME_ERROR_USUARIO_MATRICULA_MEDICA);
            esMatriculaMedicaValido = false;
        } else {
            textoMatriculaMedica.setForeground(Fuente.COLOR_NORMAL);
            textoMatriculaMedica.setToolTipText(null);
            esMatriculaMedicaValido = true;
        }

        //Manejo de la validación del documento
        if (!PersonaValidacion.validarDocumento(
                tipoDeDocumento.getSelectedItem().toString(),
                numeroDeDocumento.getText(), true)) {
            esDocumentoValido = false;
            textoTipoDeDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoNumeroDeDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoNumeroDeDocumento.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_NUMERO_DOCUMENTO);
            textoTipoDeDocumento.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_TIPO_DOCUMENTO);
        } else {
            esDocumentoValido = true;
            textoTipoDeDocumento.setForeground(Fuente.COLOR_NORMAL);
            textoNumeroDeDocumento.setForeground(Fuente.COLOR_NORMAL);
            textoNumeroDeDocumento.setToolTipText(null);
            textoTipoDeDocumento.setToolTipText(null);
        }

        //Manejo de la validación de nombre
        if (!PersonaValidacion.validarNombre(
                nombre.getText(), true)) {
            textoNombre.setForeground(
                    Fuente.COLOR_ERROR);
            textoNombre.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_NOMBRE);
            esNombreValido = false;
        } else {
            textoNombre.setForeground(Fuente.COLOR_NORMAL);
            textoNombre.setToolTipText(null);
            esNombreValido = true;
        }

        //Manejo de la validación de apellido
        if (!PersonaValidacion.validarApellido(
                apellido.getText(), true)) {
            textoApellido.setForeground(
                    Fuente.COLOR_ERROR);
            textoApellido.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_APELLIDO);
            esApellidoValido = false;
        } else {
            textoApellido.setForeground(Fuente.COLOR_NORMAL);
            textoApellido.setToolTipText(null);
            esApellidoValido = true;
        }

        //Manejo de la validación de teléfono interno
        if (!PersonaValidacion.validarTelefono(telefonoInterno.getText(), false)) {
            textoTelefonoInterno.setForeground(
                    Fuente.COLOR_ERROR);
            textoTelefonoInterno.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_NUMERO_TELEFONO);
            esTelefonoInternoValido = false;
        } else {
            textoTelefonoInterno.setForeground(Fuente.COLOR_NORMAL);
            textoTelefonoInterno.setToolTipText(null);
            esTelefonoInternoValido = true;
        }

        //Manejo de la validación de teléfono particular
        if (!PersonaValidacion.validarTelefono(telefonoParticular.getText(), false)) {
            textoTelefonoParticular.setForeground(
                    Fuente.COLOR_ERROR);
            textoTelefonoParticular.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_NUMERO_TELEFONO);
            esTelefonoParticularValido = false;
        } else {
            textoTelefonoParticular.setForeground(Fuente.COLOR_NORMAL);
            textoTelefonoParticular.setToolTipText(null);
            esTelefonoParticularValido = true;
        }

        //Manejo de la validación de teléfono movil
        if (!PersonaValidacion.validarTelefono(telefonoMovil.getText(), false)) {
            textoTelefonoMovil.setForeground(
                    Fuente.COLOR_ERROR);
            textoTelefonoMovil.setToolTipText(
                    InformeError.INFORME_ERROR_USO_COMUN_NUMERO_TELEFONO);
            esTelefonoMovilValido = false;
        } else {
            textoTelefonoMovil.setForeground(Fuente.COLOR_NORMAL);
            textoTelefonoMovil.setToolTipText(null);
            esTelefonoMovilValido = true;
        }

        //Manejo de la validación de correo electrónico
        if (!PacienteValidacion.validarCorreoElectronico(
                correoElectronico.getText(), false)) {
            textoCorreoElectronico.setForeground(
                    Fuente.COLOR_ERROR);
            textoCorreoElectronico.setToolTipText(
                    InformeError.INFORME_ERROR_PACIENTE_CORREO_ELECTRONICO);
            esCorreoElectronicoValido = false;
        } else {
            textoCorreoElectronico.setForeground(Fuente.COLOR_NORMAL);
            textoCorreoElectronico.setToolTipText(null);
        }

    return (esNombreDeUsuarioValido && esClaveValido && esClaveValido &&
            esFormatoClaveValido && esTipoDeAccesoValido && esMatriculaMedicaValido &&
            esDocumentoValido && esNombreValido && esApellidoValido &&
            esTelefonoInternoValido && esTelefonoParticularValido &&
            esTelefonoMovilValido && esCorreoElectronicoValido);
    }

    /**
     * Verifica que no exista otro usuario cargado con el mismo nombre de
     * usuario. No se verifica si se reingresa el mismo nombre usuario.
     *
     * @return true si es único, false en caso contrario
     */
    private boolean esUsuarioUnico() {
        //En caso de modificación, se verifica si no se cambió el nomre de usuario
        if (usuarioACargar.getPersona() != null &&
                usuarioACargar.getNombreDeUsuarioUsuario().equalsIgnoreCase(
                nombreDeUsuario.getText())) {
            return true;
        } else {
            return (!UsuarioLogica.existeUsuarioPorNombreDeUsuarioEnBd(
                    nombreDeUsuario.getText()));
        }
    }

    /**
     * Verifica que no exista otro usuario cargado con el mismo correo
     * electrónico. No se verifica si se reingresa el mismo correo electrónico.
     *
     * @return true si es único, false en caso contrario
     */
    private boolean esCorreoElectronicoUnico() {
        //En caso de modificación, se verifica si no se cambió el nomre de usuario
        if (usuarioACargar.getPersona() != null &&
                usuarioACargar.getPersona().getCorreoElectronicoPersona().equalsIgnoreCase(
                correoElectronico.getText())) {
            return true;
        } else {
            if (PacienteValidacion.validarCorreoElectronico(
                    correoElectronico.getText(), true)) {
                return (!PersonaLogica.existePersonaPorCorreoElectronicoEnBd(
                    correoElectronico.getText()));
            }
            return true;
        }
    }

    /**
     * Verifica que no exista otra persona cargada con el mismo documento.
     * (tipo y número). No se verifica si se reingresa el mismo documento.
     *
     * @return true si es único, false en caso contrario
     */
    private boolean esPersonaUnica() {
        //En caso de modificación, se verifica si no se cambió el documento
        if (usuarioACargar.getPersona() != null &&
                usuarioACargar.getPersona().getTipoDeDocumentoPersona().equalsIgnoreCase(
                tipoDeDocumento.getSelectedItem().toString()) &&
                usuarioACargar.getPersona().getNumeroDeDocumentoPersona().equals(
                numeroDeDocumento.getText())) {
            return true;
        } else {
            return (!UsuarioLogica.existeUsuarioPorDocumentoEnBd(
                    tipoDeDocumento.getSelectedItem().toString(),
                    numeroDeDocumento.getText()));
        }
    }

    /**
     * En caso de tratarse de una madificación se debe verificarse que realmente
     * se quiera modificarse.
     *
     * @return true si se debe modificar, false en caso contrario
     */
    public boolean confirmarModificacion() {
        boolean retorno = false;
        if (usuarioACargar.getPersona() != null) {
            //Confirmar modificación
            int confirmado = MensajePresentacion.confimarModificacionObjeto(
                    "usuario", "el");
            if (JOptionPane.OK_OPTION == confirmado) {
                retorno = true;
            } else {
                retorno = false;
            }
        } else {
            retorno = true;
        }
        return retorno;
    }

    /**
     * Imprime la información.
     */
    public void imprimir() {
        String predeterminado = "Todos los usuarios";
        if (usuarioAVisualizar != null) {
            predeterminado = "Usuario seleccionado";
        }

        int seleccion = JOptionPane.showOptionDialog(null,
           "Qué desea imprimir?",
           "Usuarios",
           JOptionPane.YES_NO_CANCEL_OPTION,
           JOptionPane.QUESTION_MESSAGE,
           Icono.ICONO_16_IMPRIMIR,    // null para icono por defecto.
           new Object[] { "Usuario seleccionado",
                           "Todos los usuarios",
                           "Cancelar"},   // null para YES, NO y CANCEL
           predeterminado);

        if (seleccion == 0 && usuarioAVisualizar != null) {
            JEditorPane impresion = new JEditorPane();
            impresion.setText(UsuarioLogica.getUsuarioHTML(usuarioAVisualizar));
            
            RestriccionAcceso.Imprimir(null, true, impresion, null);
        } else if (seleccion == 1) {
            JEditorPane impresion = new JEditorPane();
            impresion.setText(UsuarioLogica.getUsuarioHTML(null));

            RestriccionAcceso.Imprimir(null, true, impresion, null);
        }
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerBusqueda = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    //Carga la tabla de usuarios
                    MiModeloTabla.cargarTablaUsuario(buscarSegunCriterio(),
                            tablaUsuario);
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEnter = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    agregarOModificarUsuario();
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    dispose();
                }
            }
        };
        //Setear eventos
        busqueda.addKeyListener(keyListenerBusqueda);
        busqueda.addKeyListener(keyListenerEscape);
        filtrar.addKeyListener(keyListenerEscape);

        tablaUsuario.addKeyListener(keyListenerEscape);
        botonAnteriorPaginadorUno.addKeyListener(keyListenerEscape);
        botonSiguientePaginadorUno.addKeyListener(keyListenerEscape);

        nombreDeUsuario.addKeyListener(keyListenerEnter);
        nombreDeUsuario.addKeyListener(keyListenerEscape);
        clave.addKeyListener(keyListenerEnter);
        clave.addKeyListener(keyListenerEscape);
        repetirClave.addKeyListener(keyListenerEnter);
        repetirClave.addKeyListener(keyListenerEscape);
        tipoDeDocumento.addKeyListener(keyListenerEnter);
        tipoDeDocumento.addKeyListener(keyListenerEscape);
        numeroDeDocumento.addKeyListener(keyListenerEnter);
        numeroDeDocumento.addKeyListener(keyListenerEscape);
        nombre.addKeyListener(keyListenerEnter);
        nombre.addKeyListener(keyListenerEscape);
        apellido.addKeyListener(keyListenerEnter);
        apellido.addKeyListener(keyListenerEscape);
        telefonoInterno.addKeyListener(keyListenerEnter);
        telefonoInterno.addKeyListener(keyListenerEscape);
        telefonoParticular.addKeyListener(keyListenerEnter);
        telefonoParticular.addKeyListener(keyListenerEscape);
        telefonoMovil.addKeyListener(keyListenerEnter);
        telefonoMovil.addKeyListener(keyListenerEscape);
        correoElectronico.addKeyListener(keyListenerEnter);
        correoElectronico.addKeyListener(keyListenerEscape);
        botonAceptar.addKeyListener(keyListenerEscape);
        botonCancelar.addKeyListener(keyListenerEscape);
    }

    /**
     * Inicia el/los paginadores activos en esta ventana
     */
    private void iniciarPaginador() {
        //Rango de filas para cada paginador
        int rangoFilas[] = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];

        //Rango de filas para el paginador 1
        rangoFilas[0] = 5;
        //Rango de filas para el paginador 2
        rangoFilas[1] = 10;
        //Rango de filas para el paginador 3
        rangoFilas[2] = 0;

        Paginador.inicializarPaginador(rangoFilas);

        CapaPresentacion.personalizarBotonesPaginadorDesactivado(
                botonAnteriorPaginadorUno, botonSiguientePaginadorUno);
    }

    /**
     * Realiza la paginación hacia atrás.
     */
    private void paginarAtrasTablaUsuario() {
        //Retrocede el los índices
        Paginador.atrasPaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaUsuario.getModel().getColumnCount() > 0) {
               buscarSegunCriterio();
        }
    }

    /**
     * Realiza la paginación hacia adelante, teniendo en cuenta que existan elementos,
     * de lo contrario no procede a listarlos.
     */
    private void paginarAdelanteTablaUsuario() {
        //Adelanta los índices
        Paginador.adelantePaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaUsuario.getModel().getColumnCount() > 0) {
                //Si no hay elementos siguientes se vuelven los índices hacia atras
                if (buscarSegunCriterio() == null) {
                    Paginador.atrasPaginador(0);
                }
                buscarSegunCriterio();
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField apellido;
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonAnteriorPaginadorUno;
    private javax.swing.JButton botonBuscar;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonCargarUsuario;
    private javax.swing.JButton botonEliminarUsuario;
    private javax.swing.JButton botonSiguientePaginadorUno;
    private javax.swing.JTextField busqueda;
    private javax.swing.JTextField clave;
    private javax.swing.JTextArea comentarios;
    private javax.swing.JTextField correoElectronico;
    private javax.swing.JCheckBox esAdministrador;
    private javax.swing.JTextField filtrar;
    private javax.swing.JTextField matriculaMedica;
    private javax.swing.JTextField nombre;
    private javax.swing.JTextField nombreDeUsuario;
    private javax.swing.JTextField numeroDeDocumento;
    private javax.swing.JPanel paginadorUno;
    private javax.swing.JPanel panelDatosPersona;
    private javax.swing.JPanel panelDatosUsuario;
    private javax.swing.JPanel panelUsuario;
    private javax.swing.JPanel panelVisualizacionUsuario;
    private javax.swing.JTextField repetirClave;
    private javax.swing.JScrollPane scrollPaneComentarios;
    private javax.swing.JSeparator separador;
    private javax.swing.JTable tablaUsuario;
    private javax.swing.JScrollPane tablaUsuarioScrollPanel;
    private javax.swing.JTextField telefonoInterno;
    private javax.swing.JTextField telefonoMovil;
    private javax.swing.JTextField telefonoParticular;
    private javax.swing.JLabel textoApellido;
    private javax.swing.JLabel textoClave;
    private javax.swing.JLabel textoComentarios;
    private javax.swing.JLabel textoCorreoElectronico;
    private javax.swing.JLabel textoDescriptivoCargaUsuario;
    private javax.swing.JLabel textoFiltrar;
    private javax.swing.JLabel textoMatriculaMedica;
    private javax.swing.JLabel textoNombre;
    private javax.swing.JLabel textoNombreDeUsuario;
    private javax.swing.JLabel textoNumeroDeDocumento;
    private javax.swing.JLabel textoRepetirClave;
    private javax.swing.JLabel textoTelefonoInterno;
    private javax.swing.JLabel textoTelefonoMovil;
    private javax.swing.JLabel textoTelefonoParticular;
    private javax.swing.JLabel textoTipoDeAcceso;
    private javax.swing.JLabel textoTipoDeDocumento;
    private javax.swing.JComboBox tipoDeAcceso;
    private javax.swing.JComboBox tipoDeDocumento;
    // End of variables declaration//GEN-END:variables
    private Vector<Usuario> vectorUsuario;
    private String[] datosUsuario;
    private Usuario usuarioAVisualizar;
    private Usuario usuarioACargar;
}
